package o2o.service.area;

import com.jinyou.utils.common.ValidateUtil;
import o2o.area.CityInfo;
import o2o.area.CountyInfo;
import o2o.area.ProvinceInfo;
import o2o.config.dao.DataDaoSql;
import o2o.config.dao.utils.DaoUtils;
import o2o.config.dao.utils.Expression;
import o2o.config.dao.utils.QueryCondition;
import o2o.dao.PO.PojoTables;
import o2o.dao.PO.common.ResultInfo;
import o2o.dao.VO.area.ProvinceInfoVO;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.sql.Connection;
import java.util.*;

/**
 * @author qilonghe【1061268464@qq.com】
 * @ClassName areaExcelService
 * @Description:
 * @date 2020/10/20 0020 下午 6:12
 * @Version 1.0
 */
@Service
public class AreaExcelService {
    public ResultInfo excelImport(MultipartFile file, Connection con) throws Exception {
        StringBuffer bf = new StringBuffer();
        if (file == null) {
            return new ResultInfo("导入Excel文件不能为空\n");
        }

        // 获取工作簿
        XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());

        if (wb == null) {
            return new ResultInfo("导入Excel内容不能为空\n");
        }

        // 省编号集合
        Map<String, ProvinceInfoVO> provinceMap = new HashMap<>();
        // 市编号集合
        Map<String, CityInfo> cityMap = new HashMap<>();
        // 区编号集合
        Map<String, CountyInfo> countyMap = new HashMap<>();

        // 处理数据
        int sheet_size = wb.getNumberOfSheets();// Excel的页签数量
        for (int index = 0; index < sheet_size; index++) {// 遍历sheet
            // 每个页签创建一个Sheet对象
            XSSFSheet sheet = wb.getSheetAt(index);

            if (sheet == null) {
                // 内容为空 -> 下一个工作表
                bf.append("第").append(index + 1).append("个工作表不能为空\n");
                continue;
            }
            if (sheet.getSheetName() == null) {
                // 名称为空 -> 下一个工作表
                bf.append("第").append(index + 1).append("个工作表名称不能为空\n");
                continue;
            }

            for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) {// 遍历row  -> 跳过标题行,从第二行有数据的开始遍历

                XSSFRow row = sheet.getRow(i);

                if (row == null) {
                    // bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行为空\n");
                    continue;
                }
                if (row.getLastCellNum() < 2) {
                    // 列数小于3 -> 下一行
                    // bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行列数不能小于3\n");
                    continue;
                }

                XSSFCell cell = row.getCell(0);// 第一个 -> 省编号/市编号/区编号

                if ("省模板".equals(sheet.getSheetName())) {
                    if (cell == null) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行省编号不能为空\n");
                        continue;
                    }
                    cell.setCellType(CellType.STRING);
                    if (cell.getStringCellValue() == null || "".equals(cell.getStringCellValue())) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行省编号不能为空\n");
                        continue;
                    }

                    // 查询省编号是否重复
                    QueryCondition query = QueryCondition.getInstance();
                    query.addCondition(Expression.getInstance().addChild("delFlag", 0).addChild("provCode", cell.getStringCellValue()));
                    String sql = DaoUtils.getSql(PojoTables.CHN_PROVINCE, query);
                    List<ProvinceInfo> list = null;

                    list = (List<ProvinceInfo>) DataDaoSql.getInstance().list(ProvinceInfo.class, sql);

                    if (ValidateUtil.isAbsList(list) || provinceMap.containsKey(cell.getStringCellValue())) {
                        // 存在该编号的省信息 -> 跳过该行
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行省编号重复\n");
                        continue;
                    }


                    // 新纪录 -> 添加
                    ProvinceInfoVO province = new ProvinceInfoVO();
                    province.setDelFlag(0);

                    province.setProvCode(cell.getStringCellValue());// 省编号

                    if (row.getCell(1) == null || row.getCell(1).getStringCellValue() == null) {// 省名称
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行省名称不能为空\n");
                        continue;
                    }
                    row.getCell(1).setCellType(CellType.STRING);
                    province.setProvince(row.getCell(1).getStringCellValue());

                    if (row.getCell(2) == null || row.getCell(2).getStringCellValue() == null || "否".equals(row.getCell(2).getStringCellValue())) {// 是否直辖市
                        // 为空 默认为 否 处理
                        province.setIs_direct(0);
                    } else if ("是".equals(row.getCell(2).getStringCellValue())) {
                        province.setIs_direct(1);
                    }

                    // 不包含 -> 集合加入该编号
                    provinceMap.put(cell.getStringCellValue(), province);
                } else if ("市模板".equals(sheet.getSheetName())) {
                    if (cell == null) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行市编号不能为空\n");
                        continue;
                    }
                    cell.setCellType(CellType.STRING);
                    if (cell.getStringCellValue() == null || "".equals(cell.getStringCellValue())) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行市编号不能为空\n");
                        continue;
                    }

                    // 查询市编号是否重复
                    QueryCondition query = QueryCondition.getInstance();
                    query.addCondition(Expression.getInstance().addChild("delFlag", 0).addChild("cityCode", cell.getStringCellValue()));
                    String sql = DaoUtils.getSql(PojoTables.CHN_CITY, query);
                    List<CityInfo> list = (List<CityInfo>) DataDaoSql.getInstance().list(CityInfo.class, sql);

                    if (ValidateUtil.isAbsList(list) || cityMap.containsKey(cell.getStringCellValue())) {
                        // 存在该编号的市信息 -> 跳过该行
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行市编号重复\n");
                        continue;
                    }

                    CityInfo city = new CityInfo();
                    city.setDelFlag(0);

                    city.setCityCode(cell.getStringCellValue());// 市编号

                    if (row.getCell(1) == null || row.getCell(1).getStringCellValue() == null) {// 市名称
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行市名称不能为空\n");
                        continue;
                    }
                    city.setCity(row.getCell(1).getStringCellValue());

                    if (row.getCell(2) == null) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行省编号不能为空\n");
                        continue;
                    }
                    row.getCell(2).setCellType(CellType.STRING);
                    if (row.getCell(2).getStringCellValue() == null || "".equals(row.getCell(2).getStringCellValue())) {// 省编号
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行省编号不能为空\n");
                        continue;
                    }
                    city.setProvCode(row.getCell(2).getStringCellValue());

                    // 不包含 -> 集合加入该编号
                    cityMap.put(cell.getStringCellValue(), city);
                } else if ("区模板".equals(sheet.getSheetName())) {
                    if (cell == null) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行区编号不能为空\n");
                        continue;
                    }
                    cell.setCellType(CellType.STRING);
                    if (cell.getStringCellValue() == null || "".equals(cell.getStringCellValue())) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行区编号不能为空\n");
                        continue;
                    }

                    // 查询区编号是否重复
                    QueryCondition query = QueryCondition.getInstance();
                    query.addCondition(Expression.getInstance().addChild("delFlag", 0).addChild("areaID", cell.getStringCellValue()));
                    String sql = DaoUtils.getSql(PojoTables.CHN_COUNTY, query);
                    List<CountyInfo> list = (List<CountyInfo>) DataDaoSql.getInstance().list(CountyInfo.class, sql);

                    if (ValidateUtil.isAbsList(list) || countyMap.containsKey(cell.getStringCellValue())) {
                        // 存在该编号的区信息 -> 跳过该行
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行区编号重复\n");
                        continue;
                    }

                    CountyInfo county = new CountyInfo();
                    county.setDelFlag(0);

                    county.setAreaID(cell.getStringCellValue());// 区编号

                    if (row.getCell(1) == null || row.getCell(1).getStringCellValue() == null) {// 区名称
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行区名称不能为空\n");
                        continue;
                    }
                    county.setCounty(row.getCell(1).getStringCellValue());

                    if (row.getCell(2) == null) {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行市编号不能为空\n");
                        continue;
                    }
                    row.getCell(2).setCellType(CellType.STRING);
                    if (row.getCell(2).getStringCellValue() == null || "".equals(row.getCell(2).getStringCellValue())) {// 市编号
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行市编号不能为空\n");
                        continue;
                    }
                    county.setCityCode(row.getCell(2).getStringCellValue());

                    // 不包含 -> 集合加入该编号
                    countyMap.put(cell.getStringCellValue(), county);
                }
            }
        }

        if (!"".equals(bf.toString())) {
            return new ResultInfo(bf.toString());
        }

        // 验证通过 -> 导入数据
        return ImportData(provinceMap, cityMap, countyMap, con);
    }

    // 添加数据
    private ResultInfo ImportData(Map<String, ProvinceInfoVO> provinceMap, Map<String, CityInfo> cityMap, Map<String, CountyInfo> countyMap, Connection con) throws Exception {
        System.out.println(provinceMap.toString());
        System.out.println(cityMap.toString());
        System.out.println(countyMap.toString());
        // 省信息
        if (provinceMap != null && !provinceMap.isEmpty()) {
            Collection<ProvinceInfoVO> provinceInfos = provinceMap.values();
            if (provinceInfos != null && !provinceInfos.isEmpty()) {
                for (ProvinceInfoVO province : provinceInfos) {
                    DataDaoSql.getInstance().saveObj(PojoTables.CHN_PROVINCE, province, con);// 添加数据
                }
            }
        }
        // 市信息
        if (cityMap != null && !cityMap.isEmpty()) {
            Collection<CityInfo> cityInfos = cityMap.values();
            if (cityInfos != null && !cityInfos.isEmpty()) {
                for (CityInfo city : cityInfos) {
                    DataDaoSql.getInstance().saveObj(PojoTables.CHN_CITY, city, con);// 添加数据
                }
            }
        }
        // 区信息
        if (countyMap != null && !countyMap.isEmpty()) {
            Collection<CountyInfo> countyInfos = countyMap.values();
            if (countyInfos != null && !countyInfos.isEmpty()) {
                for (CountyInfo county : countyInfos) {
                    DataDaoSql.getInstance().saveObj(PojoTables.CHN_COUNTY, county, con);// 添加数据
                }
            }
        }
        return new ResultInfo("添加成功", "");
    }
}